home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / PATH_ENV / ENVIRONM.D < prev    next >
Encoding:
Modula Definition  |  1991-04-06  |  6.5 KB  |  169 lines

  1. DEFINITION MODULE Environment;
  2.  
  3. >>> Um die Def Unix/C-kompat. zu machen, das Modul "Env" von Ulrich Kaiser
  4.   berücksichtigen!
  5.  
  6. (*
  7.  * Zugriff auf Environment-Variablen (Abfrage und Setzen).
  8.  *
  9.  * Eine Env-Var hat immer folgendes Format:
  10.  *     NAME=Argument
  11.  * "NAME" muß dabei immer groß geschrieben sein, das Argument ist ein
  12.  * beliebiger Text-String. Leerzeichen vor und hinter dem Gleichheits-
  13.  * zeichen werden von den hiesigen Funktionen ignoriert/entfernt.
  14.  *)
  15.  
  16. FROM SYSTEM IMPORT ADDRESS;
  17. FROM MOSGlobals IMPORT MemArea;
  18.  
  19. (*$H+  >> lokale Prozeduren können bei den Scan-Routinen übergeben werden *)
  20.  
  21. (*
  22.  * Funktionen zum Auswerten der eigenen Env-Variablen
  23.  * --------------------------------------------------
  24.  *)
  25.  
  26. PROCEDURE GetArg (REF name: ARRAY OF CHAR; VAR arg: ARRAY OF CHAR);
  27.   (*
  28.    * Sucht die Env-Var 'name' im Environment.
  29.    * Wird sie gefunden, wird ihr Argument in 'arg' geliefert,
  30.    * sonst ist 'arg' leer.
  31.    *)
  32.  
  33. PROCEDURE ArgMEM (REF name: ARRAY OF CHAR): MemArea;
  34.   (*
  35.    * Funktion wie 'GetArg', nur wird lediglich die Adresse des
  36.    * Arguments in 'MemArea.bottom' geliefert (ist NIL, wenn die
  37.    * Var nicht vorhanden ist), 'MemArea.length' ist immer NIL.
  38.    *
  39.    * Diese Funktion ist dafür vorgesehen, Pfadlisten im Environment,
  40.    * wie z.B. die Argumente der Variable 'PATH', für eine Pfadliste
  41.    * des Moduls 'Paths' zu verwenden. Beispiel:
  42.    *
  43.    *   VAR path: Paths.PathList;
  44.    *   BEGIN
  45.    *     Paths.SetPathList (path, ArgMEM ('PATH'), envSep);
  46.    *
  47.    * Nun kann 'Paths.SearchFile' zu Suchen von Dateien in den unter
  48.    * der Env-Var "PATH" angegebenen Pfaden benutzt werden:
  49.    *
  50.    *     Paths.SearchFile ('DATEN.TXT', path, Paths.fromStart, found, name);
  51.    *
  52.    * Allerdings ist es dann nicht möglich, diese Pfadliste 'path' mittels
  53.    * der Funktionen im Modul 'Paths' zu verändern.
  54.    *)
  55.  
  56. TYPE EnvScanProc = PROCEDURE ( REF (* name: *) ARRAY OF CHAR;
  57.                                REF (* arg:  *) ARRAY OF CHAR );
  58.  
  59. PROCEDURE ScanVars (with: EnvScanProc);
  60.   (*
  61.    * Ruft 'with' mit dem String jeder im Environment vorhandenen
  62.    * Variable und ihrem Wert auf.
  63.    *
  64.    * 'with' darf auch eine lokale Prozedur sein!
  65.    *)
  66.  
  67. (*
  68.  * Zusammensetzen eines Environments für einen Programmaufruf
  69.  * ----------------------------------------------------------
  70.  *
  71.  * Soll in einem gestarteten Programm nicht das komplette eigene
  72.  * Environment (dann wäre NIL als Env-Ptr bei 'GEMDOS.Pexec' oder
  73.  * 'Loader.CallModule' zu übergeben), sondern ein modifiziertes
  74.  * übergeben werden, kann es mit den folgenden Funktionen
  75.  * erzeugt werden.
  76.  *
  77.  * Es ist sogar möglich, das eigene Environment zu verändern,
  78.  * indem als 'env'-Parameter (s.u.) die Variable 'CurrentEnv'
  79.  * übergeben wird. Nur muß dann darauf geachtet werden, daß
  80.  * in der Regel kein Erweitern des Environments möglich ist,
  81.  * weil die Größe des eigenen, vom Aufrufer erzeugten,
  82.  * Environment-Puffers nur anhand des aktuellen Inhalts
  83.  * bestimmt werden kann. Und damit ist der Env-Puffer am
  84.  * Anfang praktisch immer voll.
  85.  *
  86.  * Soll der eigene Env-Puffer erweitert werden, ohne daß
  87.  * bestehende Variablen entfernt oder ihre Argumente ver-
  88.  * kürzt werden sollen, muß dazu mit Hilfe 'CreateEnv' und
  89.  * 'CopyEnv' eine größere Kopie angelegt werden (die alte,
  90.  * Originalgröße ist aus 'CurrentEnv.length' zu ermitteln).
  91.  * Damit der neue Env-Puffer auch wirklich als neues
  92.  * Environment benutzt wird, müssen in der eigenen Base-Page
  93.  * (Adr. mit 'PrgCtrl.GetBasePageAddr' ermitteln) der Zeiger
  94.  * 'p_env' (s. Modul 'SysTypes') und auch die hiesige Variable
  95.  * 'CurrentEnv' umgesetzt werden. Bei Beendigung des Programms
  96.  * muß aber der alte Env-Ptr in der Base Page wieder hergestellt
  97.  * werden!
  98.  *)
  99.  
  100. TYPE    EnvBuffer = MemArea;  (* Dies ist der Env-Puffer-Zeiger *)
  101.  
  102. PROCEDURE CreateEnv (VAR env: EnvBuffer; size: LONGCARD; VAR ok: BOOLEAN);
  103.   (*
  104.    * Legt einen Env-Puffer der Größe 'size' (in Bytes) an.
  105.    * Alloziert dazu den Speicher mit 'Storage.ALLOCATE'.
  106.    * 'ok' liefert FALSE, wenn nicht mehr ausreichend Speicherplatz
  107.    * vorhanden ist.
  108.    * Zusätzlich wird noch der Env-Puffer definiert gelöscht.
  109.    * Am Ende sollte mit 'DeleteEnv' der Puffer wieder freigegeben werden.
  110.    *)
  111.  
  112. PROCEDURE DeleteEnv (VAR env: EnvBuffer);
  113.   (*
  114.    * Gibt den mit 'CreateEnv' angelegten Puffer wieder frei.
  115.    *)
  116.  
  117. PROCEDURE DefineEnv (VAR env: EnvBuffer; buffer: MemArea);
  118.   (*
  119.    * Falls Puffer-Adresse und -Länge eines Env-Puffers schon bekannt
  120.    * sind, oder der Puffer mit 'SysAlloc' angelegt wurde, kann hiermit
  121.    * die Initialisierung des Puffer-Zeigers erfolgen.
  122.    * (Zwar könnte dies auch durch direkte Zuweisung auf das Record
  123.    * geschehen, aber "sauberer" ist es, dazu diese Funktion zu benutzen.)
  124.    * Zusätzlich wird noch der Env-Puffer definiert gelöscht.
  125.    *)
  126.  
  127. PROCEDURE ClearEnv (env: EnvBuffer);
  128.   (*
  129.    * Löscht den Env-Puffer (braucht nicht nach 'CreateEnv' oder 'DefineEnv'
  130.    * aufgerufen werden).
  131.    *)
  132.  
  133. PROCEDURE AddEnv (fromEnv, toEnv: EnvBuffer; VAR ok: BOOLEAN);
  134.   (*
  135.    * Übernimmt alle Env-Vars von 'fromEnv' nach 'toEnv'. Beide Env-Puffer
  136.    * müssen selbstverständlich bereits angelegt bzw. initialisiert sein.
  137.    * Eine häufige Anwendung ist, das aktuelle Env. (in 'CurrentEnv')
  138.    * in ein neues zu kopieren, um dort dann Modifikationen vorzunehmen.
  139.    * Kommt eine zu kopierende Env-Var bereits im Ziel-Puffer vor, wird
  140.    * ihr Argument dort von der Neuen überschrieben.
  141.    * Ist der Ziel-Puffer zu klein, werden nur soviel Env-Vars kopiert,
  142.    * wie _vollständig_ hineinpassen und 'ok' liefert dann FALSE.
  143.    *)
  144.  
  145. PROCEDURE SetVar (env: EnvBuffer; name, arg: ARRAY OF CHAR; VAR ok: BOOLEAN);
  146.   (*
  147.    * Falls die Env-Var 'name' noch nicht existiert, wird sie mitsamt
  148.    * ihrem Argument 'arg' und dem erforderlichen Gleichheitszeichen
  149.    * eingefügt. Existiert 'name' schon, wird lediglich das Argument
  150.    * 'arg' erneuert.
  151.    * Ist 'arg' leer, wird die Var nicht eingefügt, bzw. eine vorhandene
  152.    * Var wird entfernt.
  153.    * 'name' wird vor dem Einfügen in Großbuchstaben umgewandelt.
  154.    * 'ok' liefert FALSE, wenn der Puffer nicht mehr ausreicht. Dann bleibt
  155.    * der Puffer auch unverändert.
  156.    *)
  157.  
  158. VAR CurrentEnv: EnvBuffer;
  159.   (*
  160.    * Zeiger auf das eigene Environment.
  161.    * 'GetArg', 'ArgMEM', 'ScanVars' verwenden immer dieses Environment.
  162.    *
  163.    * Er wird von diesem Modul anfangs automatisch initialisiert
  164.    * (mit dem Env-Zeiger des aktuellen GEMDOS-Prozesses bzw. Programms),
  165.    * kann aber zum Zugriff auf fremde Environments umgesetzt werden.
  166.    *)
  167.  
  168. END Environment.
  169.